O componente responsável por gerenciar e escalonar tarefas no TinyOS é o componente {\em TinySchedulerC}.
O escalonador padrão adota uma política {\em First-in First-out} para agendar as tarefas. Ele também
cuida de parte do gerenciamento de energia, colocando a CPU em um estado de baixo consumo quando
não há nada para ser executado.

O programador, ao codificar uma tarefa, utiliza duas contruções:
\begin{lstlisting}[frame=none]
    post nome_da_tarefa();
    task void nome_da_tarefa() { //Definicao da tarefa }
\end{lstlisting}
Essas duas contruções são transformadas pelo compilador, fazendo com que a aplicação implemente uma interface chamada \textit{TaskBasic}.
A primeira é transformada em um comando, usado para indicar ao escalonador que esta tarefa deve entrar na fila.
O escalonador por sua vez, quando decidir que esta tarefa será a próxima a executar, sinalizará o evento relacionado a
este comando.
A segunda sintaxe é transformada no tratador deste evento, que implementa o que a tarefa deverá executar quando
escalonada.
É esta interface que permite a conexão das tarefas ao escalonador~\cite{LevisGay/09}.
\begin{lstlisting}
interface TaskBasic {
    async command error_t postTask();
    event void runTask();
}
\end{lstlisting}

Todo escalonador, além de prover a interface \textit{TaskBasic}, também deve prover a interface \textit{Scheduler}.
\begin{lstlisting}
interface Scheduler {
    command void init();
    command bool runNextTask();
    command void taskLoop();
}
\end{lstlisting}
A implementação dessas interfaces se dá da seguinte forma:
\begin{description}
    \item[command postTask()] Decide onde a tarefa será inserida na fila.
    \item[event runTask()] Indica que a tarefa deve executar.
    \item[command runNextTask()] Retira a primeira tarefa da fila e sinaliza sua execução com o evento
    \textit{runTask()}
    \item[command taskLoop()] Laço infinito que executa o comando \textit{runNextTask()}. Caso não haja tarefa para
    executar, coloca a CPU em modo de baixo consumo. 
\end{description}

Para criar novos tipos de tarefas, é preciso
definir uma interface nova, com o comando \textit{postTask} e o evento
\textit{runTask} que será provida pelo escalonador como visto acima. Por exemplo:
\begin{lstlisting}
interface TaskDeadline<precision_tag> { 
    async command error_t postTask(uint32_t deadline);
    event void runTask(); }
\end{lstlisting}

Na versão 2.1.x do TinyOS é possível mudar a política de gerenciamento de tarefas substituindo 
o componente escalonador padrão. Qualquer novo escalonador tem de
aceitar a interface de tarefa padrão (\textit{TaskBasic}), e garantir a execução de todas as tarefas 
(ausência de {\em starvation})~\cite{TEP106}.

O componente \textit{TinySchedulerC} é uma configuração que conecta as interfaces de tarefa à implementação do
escalonador.
Para alterar o escalonador basta definir um novo componente \textit{TinySchedulerC} e adicioná-lo ao diretório da
aplicação. Neste novo componente, a interface \textit{Scheduler} deve ser associada ao componente que implementa o
escalonador proposto, como ilutrado abaixo.

Por último, deve-se amarrar a interface da tarefa com a interface do escalonador. Por exemplo:
\begin{lstlisting}
configuration TinySchedulerC {
    provides interface Scheduler;
    provides interface TaskBasic[uint8_t id];
    provides interface TaskDeadline<TMilli>[uint8_t id];
}
implementation  {
    components SchedulerDeadlineP as Sched;
    ...
    Scheduler = Sched;
    TaskBasic = Sched; 
    TaskDeadline = Sched;
}
\end{lstlisting}

Um exemplo de aplicação que utiliza um escalonador novo pode ser visto no anexo \ref{a:appTeste}.
Para que o escalonador funcione corretamente no simulador TOSSIM é preciso adicionar funções que lidam com eventos no
simulador. Um exemplo desta extensão poder ser achada no arquivo
\textit{tinyOS-root-dir/tos/lib/tossim/SimSchedulerBasicP.nc}, ou no apêndice \ref{a:escalonador-tossim}
